// 基于 axios 封装的请求模块
// 封装导出一个网络请求的方式
import axios2 from 'axios'
import bigInt from 'json-bigint'
import router from '@/router'
import store from '@/store'
// axios.defaults.baseURL = 'http://toutiao-app.itheima.net' // 请求的基础路径

const axios = axios2.create({
  //   baseURL: 'http://api-toutiao-web.itheima.net'
  baseURL: 'http://toutiao-app.itheima.net', // 请求的基础路径
  transformResponse: [function (data) { // 对内容进行处理
    // data:就是本次请求获取的数据
    // 在这里可以对它进行进一步的处理 -- JSONbig
    // 后端返回数据可能不是 JSON 字符串，而JSONbig.parse()只能处理JSON字符串
    // 所以，为了保证代码可以正常执行，这里引入try-catch来捕获异常
    try {
      // 尝试着进行大数的处理
      return bigInt.parse(data)
    } catch {
      // 大数处理失败时的后备方案
      return JSON.parse(data)
    }
  }]
})

// 请求拦截器: 可以在发起请求之前,偷摸带点什么
// 响应拦截器:处理响应状态
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  if (store.state.token.length > 0) { // 有token字符串
    config.headers.Authorization = 'Bearer ' + store.state.token
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, function (error) { // 报错4xx/5xx进入这里
  // 对响应错误做点什么
  if (error.response.status === 401) {
    router.push({ path: '/login' })
  }
  return Promise.reject(error)
})

/*
{url: url, method: method, params: params, data: data, headers: headers} =
{url: '请求地址', method: '请求方式', params: {a: 10}}
*/
// 解构赋值: const {url: url} = {url: '/v1_0/channels'};

export default ({ url, method = 'GET', params, data, headers }) => {
  const pA = axios({ // 把Promise对象 return 到api 下的方法上
    url: url,
    method: method,
    params: params,
    data: data,
    headers: headers
  })
  const pB = pA.then((res) => {
    //   错误对象，成功对象
    return [null, res]
  }).catch((err) => {
    return [err, null]
  })
  // awaitTo技术原理: then和catch里return, 都会返回给下一个Promise对象then
  // await 拿到pB的then结果
  return pB
  //   return $.ajax({
  //     url: url,
  //     type: method,
  //     data: data,
  //     header: headers
  //   })
}

// then和catch里return都会赋予给下个then, 而await可以拿到then的结果
